package InterClass03;

/*
 * 内部类四种  成员内部类  静态内部类  局部内部类  匿名内部类(前三个了解，这个要会用)
 * 内部类存在意义：B类表示A类的一部分且类单独存在没有意义
 * 比如：汽车和发动机  发动机单独存在没有意义
 * */
public class Test {
    public static void main(String[] args) {
        //成员内部类的使用
        //当内部类是共有时候可以直接实例化
        //Car.Engine e = new Car().new Engine();//把private去掉在看
        //如果内部类是私有时候需要通过外部类自己内的方法来实例化
        Car c = new Car();
        c.carName = "宝马";
        c.show();/*
		  宝马
	      V8发动机
	      30
	      20
	      10
	 */
        System.out.println("-----------------------------------------------");

        //静态内部类的使用
        /*注意：
         * 1.静态内部类可以直接创建对象
         * 2.静态内部类只能访问外部类的静态属性和方法
         * */
        Car.StaticEngine se = new Car.StaticEngine();
        se.show();//静态内部类方法
        se.show2();//静态内部类的静态方法

        Car.StaticEngine.show2();//直接调用静态内部类的静态方法

        System.out.println("-----------------------------------------------\n");


        //局部内部类就是方法里面创建了个类，不多介绍


        //匿名内部类
        /*
         * 没有名字的内部类,只能使用一次,可以在成员位置和局部位置
         * 格式:
         * 	new 类名/接口名(){
         * 		重写方法
         * 	}
         * 细节：
         * 包含了继承或者实现，方法重写，创建对象
         * 整体就是一个类的子类对象或者接口的实现类对象
         * 匿名内部类的使用前提：必须继承或者实现一个外部类或者接口
         * */
        //这个就相当有一个类实现了swim接口重写了swim方法
        //这个类没有名字，所以叫匿名内部类
        new Swim() {
            @Override
            public void swim() {
                System.out.println("我是匿名内部类的方法");
            }
        };

        //整体我们可以理解为Swim接口的实现类对象
	/* 	我们通过匿名类整出了类，这个类实现了接口Swim
		然后这个类又转给了Swim接口，这就是接口多态 */
        Swim s = new Swim() {
            @Override
            public void swim() {
                System.out.println("重写后的swim方法\n");
            }
        };
        s.swim();
		
		
		/*现在有一个Animal类，里面有eat方法
		我们现在要创建一个Animal的子类Dog，重写eat方法
		如果这个类只使用一次，就可以使用匿名内部类
		原多态方法:
		Dog d=new Dog();
		method(d)
		* */
        method(

                new Animal() {
                    @Override
                    public void eat() {
                        System.out.println("狗吃骨头");
                    }
                }

        );

    }//主函数结尾括号

    public static void method(Animal animal) {
        animal.eat();
    }

}



